const UserModel = require('../models/userModel');
const { hashPassword, comparePassword } = require('../utils/bcrypt');
const appError = require('../utils/appError');

class UserService {
  // 检查用户名是否已存在
  async isUsernameExist (username) {
    const user = await UserModel.findOne({ username });
    return !!user;
  }

  // 创建新用户
  async register(userData) {
    // 验证必填字段
    if (!userData.username || !userData.password) {
      appError(400, '用户名和密码不能为空', {
        username: !userData.username ? '用户名是必填项' : null,
        password: !userData.password ? '密码是必填项' : null
      });
    }

    // 检查用户名是否存在
    const exists = await this.isUsernameExist(userData.username);
    if (exists) {
      appError(409, '用户名已存在');
    }

    // 加密密码
    userData.password = await hashPassword(userData.password);

    // 创建新用户
    const newUser = new UserModel(userData);
    await newUser.save();
    return newUser;
  }

  // 用户登录
  async login(userData) {
    const { username, password } = userData;
    const user = await UserModel.findOne({ username });
    
    if (!user) {
      appError(400, '用户名不存在');
    }
    const isMatch = await comparePassword(password, user.password);
    if (!isMatch) {
      appError(400, '密码错误');
    }

    // 用户状态为 0 时表示禁用
    if (user.status === 0) {
      appError(400, '用户已禁用，请联系管理员');
    }

    // 更新最后登录时间
    const last_login = Date.now();
    await UserModel.updateOne({ user_id: user.user_id }, { $set: { last_login } });

    return { userInfo: user, last_login };
  }

  // 更新用户信息
  async update(userData) {
    const { id } = userData;
    const user = await UserModel.findOne({ user_id: id });
    if (!user) {
      appError(400, '用户不存在');
    }

    // 更新用户信息
    await UserModel.updateOne({ user_id: id }, { $set: userData });
    return await UserModel.findOne({ user_id: id });
  }

  // 删除用户
  async delete(id) {
    const user = await UserModel.findOne({ user_id: id });
    if (!user) {
      appError(400, '用户不存在');
    }
    await UserModel.deleteOne({ user_id: id })
  }

  // 获取单个用户
  async findOne(id) {
    const user = await UserModel.findOne({ user_id: id });
    if (!user) {
      appError(400, '用户不存在');
    }
    return user;
  }

  // 获取所有用户
  async findAll() {
    return await UserModel.find({}, { password: 0 });
  }

  // 检查用户名是否已存在
  async isUsernameExist(username) {
    const user = await UserModel.findOne({ username });
    return !!user;
  }

  // 重置密码
  async resetPassword(user_id, password) {
    // 加密密码
    const newPassword = await hashPassword(password);
    await UserModel.updateOne({ user_id }, { $set: { password: newPassword } });
  }
}

module.exports = new UserService();